package lanqiaobei2016;

public class _07方格填数 {
    /**
     * 见方格填数图
     * 填入0~9的数字。要求：连续的两个数字不能相邻。
     * （左右、上下、对角都算相邻）
     * 一共有多少种可能的填数方案？
     * 请填写表示方案数目的整数。
     * 注意：你提交的应该是一个整数，不要填写任何多余的内容或说明性文字。
     */
    static int ans = 0;
    public static void main(String[] args) {
        int[] a = {0,1,2,3,4,5,6,7,8,9};
        per(a,0);
        System.out.println(ans);
    }

    private static void per(int[] a, int k) {
        if (k == 10){
            if (check(a)) ans++;
        }
        for (int i = k ; i < 10 ; i++){
            int temp = a[i];
            a[i] = a[k];
            a[k] = temp;

            per(a,k+1);

            temp = a[i];
            a[i] = a[k];
            a[k] = temp;

        }
    }

    private static boolean check(int[] a) {
        if(a[0]-a[4]==-1||a[0]-a[4]==1)
            return false;
        if(a[3]-a[4]==-1||a[3]-a[4]==1)
            return false;
        if(a[5]-a[4]==-1||a[5]-a[4]==1)
            return false;
        if(a[7]-a[4]==-1||a[7]-a[4]==1)
            return false;
        if(a[8]-a[4]==-1||a[8]-a[4]==1)
            return false;
        if(a[9]-a[4]==-1||a[9]-a[4]==1)
            return false;
        if(a[1]-a[4]==-1||a[1]-a[4]==1)
            return false;
        if(a[1]-a[5]==-1||a[1]-a[5]==1)
            return false;
        if(a[1]-a[6]==-1||a[1]-a[6]==1)
            return false;
        if(a[0]-a[5]==-1||a[0]-a[5]==1)
            return false;
        if(a[2]-a[5]==-1||a[2]-a[5]==1)
            return false;
        if(a[8]-a[5]==-1||a[8]-a[5]==1)
            return false;
        if(a[9]-a[5]==-1||a[9]-a[5]==1)
            return false;
        if(a[6]-a[5]==-1||a[6]-a[5]==1)
            return false;
        if(a[6]-a[9]==-1||a[6]-a[9]==1)
            return false;
        if(a[6]-a[2]==-1||a[6]-a[2]==1)
            return false;
        if(a[3]-a[0]==-1||a[3]-a[0]==1)
            return false;
        if(a[3]-a[7]==-1||a[3]-a[7]==1)
            return false;
        if(a[8]-a[7]==-1||a[8]-a[7]==1)
            return false;
        if(a[8]-a[3]==-1||a[8]-a[3]==1)
            return false;
        if(a[9]-a[8]==-1||a[9]-a[8]==1)
            return false;
        if(a[1]-a[0]==-1||a[1]-a[0]==1)
            return false;
        if(a[1]-a[2]==-1||a[1]-a[2]==1)
            return false;
        return true;
    }
}
